4.6. Настройка ssl-сертификатов на компонентах ServiceGate¶
Сервисы ServiceGate для хранения сертификатов и ключей SSL используют специальное хранилище в формате Java Keystore (далее JKS). Для работы с JKS необходима утилита keytool, которая идет в комплекте с Java JDK.
Ниже будут описаны настройки Sgate, которые необходимо сделать для работы SSL, а также примеры формирования хранилища JKS.
4.6.1. Описание настроек SSL, которые хранятся в Vault¶
В Vault хранятся следующие настройки SSL:
- sgate/common/ssl.enabled
- Включает/выключает поддержку SSL сервисом (true или false).
- ssl.store-path
- Путь к хранилищу ключей SSL в контейнере. Путь, по которому сервис будет выполнять поиск файла keystore.jks относительно своего classpath (если запускается сервис в контейнере, то в classpath по умолчанию входит /app/resources, /app/classes, /app/libs/).
- sgate/common/ssl.store-pass
- Пароль к хранилищу ключей SSL (пароль на хранилище keystore).
- sgate/common/ssl.key-pass
- Пароль к ключу в хранилище (пароль на закрытый ключ).
Примечание
Существует список общих настроек SSL, которые хранятся в Vault. Но есть возможность указать те же настройки SSL и для каждого сервиса отдельно. В этом случае приоритет у последних будет выше.
4.6.2. Пример генерации параметра «keystore» с самоподписанным сертификатом¶
Параметры «keystore» и «keypass» задают пароли на хранилище и закрытый ключ. Эти параметры необходимо указать в Vault соответственно по путям sgate/common/ssl.store-pass и sgate/common/ssl.key-pass:
keytool -genkey -dname "cn=sgate-test.igtel.ru, ou=dev, o=IGTEL, c=RU"
-alias sgate-dev -keypass 123456 -keystore ./keystore.jks -storepass 123456 -validity 3650
-keyalg RSA -ext SAN=dns:sgate-test.igtel.ru
4.6.3. Пример создания параметра «keystore» на основе существующей цепочки сертфикатов и закрытого ключа¶
Для создания параметра «keystore» на основе существующей цепочки сертфикатов и закрытого ключа необходимо выполнить следующее:
Создать хранилище PFX (PKCS#12):
openssl pkcs12 -export -in cert-chain.pem -inkey private.key -name sgate-test.igtel.ru -out sgate-test.igtel.ru.pfx
Создать новый Java keystore в формате JKS и импортируем туда PFX:
keytool -importkeystore -destkeystore keystore.jks -srckeystore sgate-test.igtel.ru.pfx -srcstoretype PKCS12
4.6.4. Настройка SSL в сервисах ServiceGate¶
Настройка SSL в сервисе бэкенда выполняется одним из двух способов:
В случае если используется заранее подготовленный образ виртуальной машины ServiceGate, то достаточно положить готовый keystore внутри виртуальной машины по пути /home/sgate/sgate-docker/volumes/ssl/keystore.jks. В данном случае всеми сервисами будет использован общий файл keystore.jks.
Для того, чтобы сервис задействовал SSL необходим включенный параметр ssl.enabled (см. Описание настроек SSL, которые хранятся в Vault).
При обновлении файла JKS потребуется перезапуск сервисов.
В случае если используется самостоятельное разворачивание контейнера в собственной среде Docker, то необходимо обеспечить наличие хранилища JKS внутри контейнера относительно classpath приложения (как правило, достаточно положить в /app/resources контейнера).
4.6.5. Настройка SSL в сервисе UI (фронтенда)¶
Контейнер с UI поставляется с Nginx. Если необходимо включить SSL на уровне контейнера с UI, то следует руководствоваться соответствующуей документацией по настройке на официальном сайте Nginx (https://nginx.org/).
Если используется заранее подготовленный образ виртуальной машины ServiceGate, то настройки Nginx находятся внутри виртуальной машины по пути /home/sgate/sgate-docker/volumes/sgate-ui/nginx.
Затем, после сделанных настроек внутри виртуальной машины ServiceGate для Nginx, можно отправить сигнал процессу Nginx на перезапуск конфигурации командой:
docker exec sgate-docker_ui_1 nginx -s reload.
4.6.6. Настройка SSL для Vault¶
В данном разделе описываются необходимые настройки для доступа к Vault по протоколу HTTPS, но не настройки аутентификации через SSL/TLS.
В случае если используется заранее подготовленный образ виртуальной машины ServiceGate, то необходимо настроить tls listener по пути /etc/vault/config.hcl:
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 0
tls_cert_file = "/etc/certs/vault.crt"
tls_key_file = "/etc/certs/vault.key"
}
Здесь tls_disable = 0 включает SSL, tls_cert_file и tls_key_file указывают на пути к файлам сертификата и закрытого ключа.
Это минимальные настройки внутри файла config.hcl для включения HTTPS, см. дополнительную информацию по настройке Vault по ссылке https://www.vaultproject.io/docs/configuration/listener/tcp.
Далее необходимо прописать HTTPS для переменной VAULT_ADDR в файле /home/sgate/.bash_profile (необходимо для консольного подключения к Vault и для сервиса vault-auto-unseal):
VAULT_ADDR="https://127.0.0.1:8200"
Контейнеры с сервисами используют HTTP API для аутентификации через token. Для того, чтобы они подключались к Vault по протоколу HTTPS необходимо в файле /home/sgate/sgate-docker/.env скорректировать URL:
VAULT_URL=https://sgate-test.igtel.ru:8200
Затем необходимо перезапустить контейнеры встроенной командой sgate-ctl stopall / sgate-ctl startall (команды находятся в процессе разработки, синтаксис может измениться в будущем):
[sgate@sgate-test scripts]$ sgate-ctl stopall
Stopping sgate-docker_ui_1 ...
Stopping sgate-docker_ui_1 ... done
Stopping sgate-docker_integration-solr_1 ... done
Stopping sgate-docker_integration-db_1 ... done
Stopping sgate-docker_integration-ldap_1 ... done
[sgate@sgate-test scripts]$ sgate-ctl startall
Starting backend ... done
Starting integration-db ... done
Starting integration-ldap ... done
Starting integration-solr ... done
Starting ui ... done
Примечание
Если для Vault используется самоподписанный сертификат или сертификат подписанный удостоверяющим центром предприятия, то может потребоваться правка файла cacerts на уровне JDK контейнеров.
В файле cacerts содержатся сертификаты УЦ.
Пример команды для подключения собственного файла сертификата УЦ:
keytool -import -alias new-cert -keystore /opt/openjdk-14/lib/security/cacerts -storepass changeit -file ca.pem
Далее измененный cacerts необходимо добавить внутрь контейнеров сервисов по пути /opt/openjdk-14/lib/security/cacerts (в дальнейшем путь может измениться при переходе на другие версии JDK).